Wieloklik

Autorzy: Marek Dądrowski, Marek Sawicki (fizyka profil ogólnooakademici)
Zaawansowanie: działa, jeszcze rozbudowywany (drobne zmiany)
Cel: nauka Arduino, nauka programowania i pracy w grupie (dwie osoby to już grupa!)
Zastosowanie: w kolejnych, większych projektach

WIELOKLIK?

A coż to takiego? Otóż studenci zafascynowani modułem przyciski oraz 3-ma LEDami postawnowili zrealizować wielostopnione sterowanie przyciskiem. Chodzi o to, aby przy użyciu tylko jednego przycisku można było wybrać różne opcje – zdecydowano, że będzie ich siedem. Czyli nie potrzebujemy aż siedmiu różnych przycisków (modułów), ale tylko ten jeden – a mimo to wybieramy jedną z siedmiu opcji. To bardzo ciekawe zagadnienie i niesamowicie użyteczne – chyba we wszystkich gadgetach elektronicznych dąży się do zmniejszenia przycisków nimi sterującymi (to ze względu na wszechobecną miniaturyzycję -weźmy taki smartwatch – ma on z 1000 różnych funkcji, ale przycisk tylko jeden albo dwa!).

Cóż to są za opcje do wyboru w naszym przypadku? Na razie to „tylko” zaświecenie konkretnymi ledami – ale w systemie binarnym, dlatego zamiast 8-LEDów mamy ich tylko 3. Ktoś tu jest fascynatem zer i jedynek ?

Wieloklik działa na zasadzie liczenia czasu od ostatniego kliknięcia – jeśli kliknięcie wydarzyło się niedawno (zmienna czas_klikania, np. 800 ms) to takie klikniecie zaliczamy do kontynuowania i zwiększamy jakiś licznik, będący numerem wybranej opcji (zmienna licznik). Poniżej schemat blokowy algorytmu (wykonany w programie https://www.draw.io/)

W powyższym schemacie T1 i T2 są kluczowymi zmiennymi: przechowują czas kliknięcia i ostatniego kliknięcia przycisku. Akcja DEBOUNCING to programowe wykluczenie drgania styków na przycisku, polegające na zatrzymaniu programu na chwilę (zmienna czekanie poniżej). Akcja LEDy to zaświecenie trzema ledami w kodzie binarnym zgodnie z LICZNIKIEM. Funkcja czas_ms to funkcja odczytująca aktualny czas, w Arduino to millis(). Poniżej kod relizujący ten schemat.

Kod w wersji 0.7, ciągle w rozbudowie choć działa 😉

#define przycisk 7 
#define diodanr1 5 
#define diodanr2 4 
#define diodanr3 3 

unsigned long aktualnyczas = 0;
unsigned long roznicaczasu = 0;
unsigned long zapamietanyczas = 0;

#define czekanie 200
#define czasklikanie 800

int licznik = 0;

void setup() {
  pinMode(przycisk, INPUT);//modul przycisku, hardware pull down
  pinMode(diodanr1, OUTPUT);
  pinMode(diodanr2, OUTPUT);
  pinMode(diodanr3, OUTPUT);
  Serial.begin(9600);
  bity(0); //LED-y wygaszone
}

void loop() {
  aktualnyczas = millis();
  roznicaczasu = aktualnyczas - zapamietanyczas;
  
  if (digitalRead(przycisk) == HIGH) {
    delay(czekanie); //drgania stykow, software debouncing
    if (roznicaczasu < czasklikanie ) {
      licznik++;
      if (licznik >= 7) licznik = 0; 
      Serial.println(licznik);
      bity(licznik);
    }
    else  //za duzo czasu minelo, liczenie od zera
      licznik = 0;
    zapamietanyczas = aktualnyczas; 
  }//czy przycisk wcisniety
}

//wyswietalnie "x"-a w kodzie binarnym na trzech LED-ach
void bity (int x) {
  switch (x) {
    case 0 :digitalWrite(diodanr3,LOW);digitalWrite(diodanr2,LOW); digitalWrite(diodanr1,LOW);
      break;
    case 1 : digitalWrite(diodanr3, HIGH); digitalWrite(diodanr2, LOW); digitalWrite(diodanr1, LOW);
      break;
    case 2 : digitalWrite(diodanr2, HIGH); digitalWrite(diodanr3, LOW); digitalWrite(diodanr1, LOW);
      break;
    case 3 : digitalWrite(diodanr3, HIGH); digitalWrite(diodanr2, HIGH); digitalWrite(diodanr1, LOW);
      break;
    case 4 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr2, LOW); digitalWrite(diodanr3, LOW);
      break;
    case 5 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr3, HIGH); digitalWrite(diodanr2, LOW);
      break;
    case 6 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr2, HIGH); digitalWrite(diodanr3, LOW);
      break;
    case 7 : digitalWrite(diodanr1, HIGH); digitalWrite(diodanr2, HIGH); digitalWrite(diodanr3, HIGH);
      break;
    default :
      break;
  }
}

Dwukliki, trzykliki itd

Rozbudowa projektu o zliczanie podwójnych kliknięć, oraz potrójnych (a skoro to wyszło, to już droga otwarta do kolejnych wiloklików). Sposób postępowania podobny jak poprzednio, choć trochę się to komplikuje… Ale udało się – filmik poniżej przedstawia działający układ, który wykrywa pojedyncze, podwójne oraz potrójne kliknięcie – wykrywa i przełącza (zapala lub gasi) odpowiednio pierwszego, drugiego lub trzeciego LED-a.

Wieloklik w akcji.